---
title: "Apache Server"
date: 2020-03-07
tags:
---

<div id="content">
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org09f2377">Apache2</a>
<ul>
<li><a href="#orgf487055">CGI</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="outline-2" id="outline-container-org09f2377">
<h2 id="org09f2377">Apache2</h2>
<div class="outline-text-2" id="text-org09f2377">
<ul class="org-ul">
<li>环境：ubuntu 18</li>
</ul>
<p>
ubuntu 上的apache2安装后配置文件的结构如下：
</p>
<pre class="example">
/etc/apache2/
├── apache2.conf 主配置文件，内容就是引入 *-enabled 下面的配置
├── conf-available/
├── conf-enabled/ 其中是指向 conf-available 中文件的软链接
├── envvars
├── magic
├── mods-available/
├── mods-enabled/ 其中的文件是指向 mods-available 中文件的软链接
├── ports.conf
├── sites-available/
└── sites-enabled/ 其中的文件是指向 sites-available 中文件的软链接
</pre>
<p>
有几个方便的命令去开启/关闭配置、模块、站点：
a2enconf  a2enmod   a2ensite  a2disconf  a2dismod   a2dissite
</p>
</div>
<div class="outline-3" id="outline-container-orgf487055">
<h3 id="orgf487055">CGI</h3>
<div class="outline-text-3" id="text-orgf487055">
<p>
开启CGI功能：
</p>
<pre class="example">
a2enmod cgi
</pre>
<p>
上面的命令如果出现：
</p>
<blockquote>
<p>
Your MPM seems to be threaded. Selecting cgid instead of cgi.
Module cgid already enabled
</p>
</blockquote>
<p>
意思是在开启cgid而不是cgi。
如果apache服务器是多线程的方式运行的，那么fork apache进程去执行脚本，将非常耗时，因为进程中所有线程都会被fork。而cgid会创建一个单独的进程来专门用来fork和执行脚本。除了这个改良，cgid与cgi行为相同。
</p>
<p>
配置serve-cgi-bin.conf应该是默认开启的。这个文件配置了一个cgi脚本目录，ubuntu上是 /usr/lib/cgi-bin，将脚本放在这个目录下面，脚本的权限需要755才能执行。
</p>
<div class="org-src-container">
<pre class="src src-py">#! /usr/bin/python3

import cgi
import cgitb                     # 用于显示错误
cgitb.enable()

print("Content-Type: text/html")# Response Header
print()                          # Response header end，使用一个换行符表示响应头部的结束，HTTP协议中的定义
print("CGI worked")
print()
</pre>
</div>
<p>
上面这段测试脚本一度让我以为CGI没有被正确配置。因为之前写的Content-Type为text/plain，有的浏览器会弹出下载框，所以以为是服务器将脚本当成静态文件处理，而没有执行。
改成text/html之后，浏览器上显示“CGI worked”，CGI正常工作。
</p>
</div>
</div>
</div>
</div>
<div class="status" id="postamble">
<p class="date">Date: 2020-03-07</p>
<p class="author">Author: gdme1320</p>
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
